package com.ankang.util;

import com.ankang.util.rfid.RF218x;

import java.net.InetAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class RFIDUtil {

    public String getRfid(String ip,int port){
        // 读卡器配置参数（请根据实际情况修改）
//        String ip = "192.168.1.192"; // 读卡器IP地址
//        int port = 6000;             // 读卡器端口号
        RF218x rf = new RF218x();
        final boolean[] hasReadCard = {false};
        final long[] startTime = {0};
        String mostFrequentCard = null;
        // 用于统计卡号出现次数（线程安全的Map）
        Map<String, Integer> cardCountMap = new ConcurrentHashMap<>();

        try {
            // 初始化并连接读卡器
            rf.init(InetAddress.getByName(ip), port);
            rf.connect();
            System.out.println("读卡器连接成功");

            // 注册卡号读取事件回调
            rf.OnTagsRead = (sender, tags) -> {
                // 首次读到卡号时记录开始时间
                if (!hasReadCard[0]) {
                    hasReadCard[0] = true;
                    startTime[0] = System.currentTimeMillis();
                    System.out.println("开始统计卡号...");
                }
                // 统计卡号出现次数
                for (String cardNo : tags) {
                    cardCountMap.put(cardNo, cardCountMap.getOrDefault(cardNo, 0) + 1);
//                    System.out.println("读到卡号：" + cardNo);
                }
            };
            // 启动轮询读卡
            rf.startPoll();
            System.out.println("开始轮询读卡...");
            // 等待读到卡号，如果未读到则一直等待
            while (!hasReadCard[0]) {
                TimeUnit.MILLISECONDS.sleep(100);
            }
            // 读到卡号后，再等待1秒统计
            TimeUnit.SECONDS.sleep(1);
            // 停止轮询
            rf.stopPoll();
            System.out.println("停止读卡");
            // 找出出现次数最多的卡号
            if (!cardCountMap.isEmpty()) {

                int maxCount = 0;
                for (Map.Entry<String, Integer> entry : cardCountMap.entrySet()) {
                    if (entry.getValue() > maxCount) {
                        maxCount = entry.getValue();
                        mostFrequentCard = entry.getKey();
                    }
                }
                System.out.println("1秒内出现次数最多的卡号：" + mostFrequentCard
                        + "，出现次数：" + maxCount);
            } else {
                System.out.println("1秒内未读到有效卡号");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 确保关闭连接
                if (rf.isConnected()) {
                    rf.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

       return mostFrequentCard;
    }
}
